De acuerdo con la información de car.names renombrarán las columnas como sigue:
También podemos ver que la distribución de la clase no es normal:
Siendo:
Los datos no contienen nulos sum(is.na(datos))
[1] 0
Resumén de los datos usando str(datos)
'data.frame': 1727 obs. of 7 variables:
$ buying : chr "vhigh" "vhigh" "vhigh" "vhigh" ...
$ maint : chr "vhigh" "vhigh" "vhigh" "vhigh" ...
$ doors : chr "2" "2" "2" "2" ...
$ persons : chr "2" "2" "2" "2" ...
$ lug_boot: chr "small" "small" "med" "med" ...
$ safety : chr "med" "high" "low" "med" ...
$ clase : chr "unacc" "unacc" "unacc" "unacc" ...
|| || || ||
Estas variables serán transformadas a factores para su mejor manejo.
'data.frame': 1727 obs. of 7 variables:
$ buying : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
$ maint : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
$ doors : Factor w/ 4 levels "2","3","4","5more": 1 1 1 1 1 1 1 1 1 1 ...
$ persons : Factor w/ 3 levels "2","4","more": 1 1 1 1 1 1 1 1 2 2 ...
$ lug_boot: Factor w/ 3 levels "big","med","small": 3 3 2 2 2 1 1 1 3 3 ...
$ safety : Factor w/ 3 levels "high","low","med": 3 1 2 3 1 2 3 1 2 3 ...
$ clase : Factor w/ 4 levels "acc","good","unacc",..: 3 3 3 3 3 3 3 3 3 3 ...
|| || || ||
Aquí termina el primer análisis y transformación de los datos
Como podemos ver, las compras tienen una distribución uniforme y todas se mueven alrededor del 25%. Significa que el costo de compra es igual.
Al igual que el precio de compras, el costo de mantenimiento también sigue una distribución uniforme y todas se mueven alrededor del 25%. Significa que el costo de mantenimiento es similar.
De nuevo, vemos una distribución uniform, el costo de mantenimiento también sigue una distribución uniforme y todas se mueven alrededor del 25%. Significa que existen la misma cantidad de vehiculos con diferente número de puertas.
Acá tenemos algo esperado, tenemos el mismo numero de vehiculos en cuanto a capacidad de persosna capaz de llevar.
De misma forma, no varia
Ya ni me tomaré la molestia
Esta parte es verdaderamente interesante, probablemente en esta variable es donde gire el analisis.
Podemos ver que a medida que la clase baja sus observaciones aumenta y a medida que la clase es mejor su porcentaje baja drasticamente a un deplorable 3%.
Nos hace preguntar, esta variable estará relacionada con la seguridad?
Como podemos apreciar, se aprecia claramente que la clase esta relacionada con la seguridad. unacc contiene más vehiculos con seguridad baja, acc contiene vehiculos con seguridad media y alta y por ultimo vgood unicamente tiene vehiculos con seguridad alta.
Otroa gran comparativa sería conocer el numero de personas relacionadas a las puertas
Antes de arrancar con el árbol, se crearan un training set y un testing set de un 70 y 30 %.
Del ejercicio anterior nos percatamos que teníamos una data bastante inestable, luego de hacer algunas investigaciones encontramos este articulo, por lo que estuvimos investigando formas de dividir nuestros datos y encontramos este otro articulo, en el cual nos dice que:
The function
createDataPartitioncan be used to create balanced splits of the data. If theyargument to this function is a factor, the random sampling occurs within each class and should preserve the overall class distribution of the data. For example, to create a single 80/20% split of the iris data:
Es por lo que esteremos usando este código.
Como podemos ver, nuestro árbol esta sobredimensionado, es decir es inestable.
Por defecto se poda el árbol considerando cp = 0.01, que
puede ser adecuado en muchos casos. Sin embargo, para seleccionar el
valor óptimo de este (hiper)parámetro se puede emplear validación
cruzada.
En primer lugar habría que establecer cp = 0 para
construir el árbol completo, a la profundidad máxima (determinada por
los valores de minsplit y minbucket, que se
podrían seleccionar “a mano” dependiendo del número de observaciones o
también considerándolos como hiperparámetos; esto último no está
implementado en rpart, ni en principio en
caret)
Posteriormente podemos emplear las funciones printcp()
(o plotcp()) para obtener (representar) los valores de CP
para los árboles (óptimos) de menor tamaño junto con su error de
validación cruzada xerror (reescalado de forma que el
máximo de rel error es 1)
Esperemos reducir la anmsiedad al árbol
Classification tree:
rpart(formula = clase ~ ., data = training, method = "class",
cp = 0)
Variables actually used in tree construction:
[1] buying doors lug_boot maint persons safety
Root node error: 416/1384 = 0.30058
n= 1384
CP nsplit rel error xerror xstd
1 0.1382212 0 1.00000 1.00000 0.041004
2 0.1093750 2 0.72356 0.72356 0.036892
3 0.0396635 4 0.50481 0.54808 0.033173
4 0.0312500 7 0.38462 0.39904 0.029055
5 0.0216346 9 0.32212 0.36779 0.028042
6 0.0168269 12 0.25721 0.33654 0.026966
7 0.0132212 14 0.22356 0.28606 0.025070
8 0.0096154 16 0.19712 0.23317 0.022830
9 0.0080128 18 0.17788 0.21394 0.021937
10 0.0072115 21 0.15385 0.21154 0.021821
11 0.0024038 25 0.12500 0.18269 0.020373
12 0.0000000 26 0.12260 0.19231 0.020870
Error de validación cruzada (reescalado) dependiendo del parámetro de complejidad CP empleado en el ajuste del árbol de decisión.
La tabla con los valores de las podas (óptimas, dependiendo del
parámetro de complejidad) está almacenada en la componente
$cptable
CP nsplit rel error xerror xstd
1 0.138221154 0 1.0000000 1.0000000 0.04100369
2 0.109375000 2 0.7235577 0.7235577 0.03689233
3 0.039663462 4 0.5048077 0.5480769 0.03317302
4 0.031250000 7 0.3846154 0.3990385 0.02905469
5 0.021634615 9 0.3221154 0.3677885 0.02804228
6 0.016826923 12 0.2572115 0.3365385 0.02696577
7 0.013221154 14 0.2235577 0.2860577 0.02507018
8 0.009615385 16 0.1971154 0.2331731 0.02283041
9 0.008012821 18 0.1778846 0.2139423 0.02193656
10 0.007211538 21 0.1538462 0.2115385 0.02182139
11 0.002403846 25 0.1250000 0.1826923 0.02037273
12 0.000000000 26 0.1225962 0.1923077 0.02087000
Ahora, podemos seleccionar un valor óptimo mediante el criterio de un error estándar (bibliografía).
CP nsplit rel error xerror xstd
0.002403846 25.000000000 0.125000000 0.182692308 0.020372733
Veamos si ya podemos reducir esa anmsiedad
Podríamos estudiar el modelo, por ejemplo mediante el método
summary(), que entre otras cosas muestra una medida (en
porcentaje) de la importancia de las variables explicativas para la
predicción de la respuesta (teniendo en cuenta todas las particiones,
principales y secundarias, en las que se emplea cada variable
explicativa).
safety persons maint buying lug_boot doors
34.8 18.2 17.7 12.8 12.6 3.9
Confusion Matrix and Statistics
Reference
Prediction acc good unacc vgood
acc 281 0 21 0
good 17 56 3 1
unacc 9 0 944 0
vgood 1 0 0 51
Overall Statistics
Accuracy : 0.9624
95% CI : (0.951, 0.9718)
No Information Rate : 0.6994
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.9194
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: acc Class: good Class: unacc Class: vgood
Sensitivity 0.9123 1.00000 0.9752 0.98077
Specificity 0.9805 0.98419 0.9784 0.99925
Pos Pred Value 0.9305 0.72727 0.9906 0.98077
Neg Pred Value 0.9750 1.00000 0.9443 0.99925
Prevalence 0.2225 0.04046 0.6994 0.03757
Detection Rate 0.2030 0.04046 0.6821 0.03685
Detection Prevalence 0.2182 0.05564 0.6886 0.03757
Balanced Accuracy 0.9464 0.99209 0.9768 0.99001
Confusion Matrix and Statistics
Reference
Prediction acc good unacc vgood
acc 70 0 12 0
good 2 13 1 3
unacc 2 0 228 0
vgood 2 0 0 10
Overall Statistics
Accuracy : 0.9359
95% CI : (0.9045, 0.9594)
No Information Rate : 0.7026
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.8642
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: acc Class: good Class: unacc Class: vgood
Sensitivity 0.9211 1.00000 0.9461 0.76923
Specificity 0.9551 0.98182 0.9804 0.99394
Pos Pred Value 0.8537 0.68421 0.9913 0.83333
Neg Pred Value 0.9770 1.00000 0.8850 0.99094
Prevalence 0.2216 0.03790 0.7026 0.03790
Detection Rate 0.2041 0.03790 0.6647 0.02915
Detection Prevalence 0.2391 0.05539 0.6706 0.03499
Balanced Accuracy 0.9381 0.99091 0.9632 0.88159
Para finalizar estamos usando glm, este se usa para ajustar modelos lineales generalizados, especificados dando una descripción simbólica del predictor lineal y una descripción de la distribución de errores.
Call:
glm(formula = safety ~ ., family = quasibinomial, data = training)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.2754 -0.9826 0.4668 0.8314 1.6446
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.1047 0.3065 -6.868 9.88e-12 ***
buyinglow 0.7391 0.1925 3.840 0.000129 ***
buyingmed 0.5525 0.1812 3.049 0.002340 **
buyingvhigh -0.3119 0.1747 -1.785 0.074531 .
maintlow 0.3566 0.1909 1.868 0.061962 .
maintmed 0.2938 0.1848 1.590 0.112157
maintvhigh -0.5932 0.1785 -3.323 0.000916 ***
doors3 0.3296 0.1789 1.842 0.065652 .
doors4 0.3890 0.1805 2.155 0.031342 *
doors5more 0.4317 0.1783 2.421 0.015622 *
persons4 1.6865 0.1983 8.505 < 2e-16 ***
personsmore 1.6257 0.1939 8.384 < 2e-16 ***
lug_bootmed -0.3329 0.1597 -2.085 0.037280 *
lug_bootsmall -0.7245 0.1599 -4.531 6.37e-06 ***
clasegood -0.2235 0.3096 -0.722 0.470443
claseunacc 2.6812 0.1972 13.598 < 2e-16 ***
clasevgood -17.2451 319.4129 -0.054 0.956951
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for quasibinomial family taken to be 0.9304794)
Null deviance: 1747.2 on 1383 degrees of freedom
Residual deviance: 1386.8 on 1367 degrees of freedom
AIC: NA
Number of Fisher Scoring iterations: 15